3. Variables Cuantitativas

Procedemos a analizar las variables cuantitativas.

import pandas as pd 
import numpy as np
import folium
import math
import time
from scipy import stats
pd.options.mode.chained_assignment = None  # default='warn'
from plotnine import ggplot, aes, geom_line, geom_point, geom_bar, geom_boxplot
import scipy.stats as ss
import matplotlib.pyplot as plot
import seaborn as sb
from seaborn import kdeplot
dataframe = pd.read_csv('/home/inma/Master_Data_Science _Contenido/Fundamentos_de_Analisis _de_Datos/Practica/Datos/Melbourne_housing_FULL.csv')
%run -i Variablescuantitativas.py
/home/inma/HH_intro_git_ds/practicaFundamentosAD/Variablescuantitativas.py:190: UserWarning: Boolean Series key will be reindexed to match DataFrame index.

En primer lugar vamos a realizar una inspeccion ocular del dataset:

dataframe2016=dataframe[dataframe["Date"].str[-4:] =='2016']
dataframe2016.describe()
print("precio medio 2016 ",dataframe2016["Price"].mean())
dataframe2017=dataframe[dataframe["Date"].str[-4:] =='2017']
print("precio medio 2017 ",dataframe2017["Price"].mean())
dataframe2017.describe()
dataframe2018=dataframe[dataframe["Date"].str[-4:] =='2018']
print("precio medio 2018 ",dataframe2018["Price"].mean())
dataframe2017.describe()
dataframe.head()
precio medio 2016  1063226.505338962
precio medio 2017  1051144.058702236
precio medio 2018  1017458.4129014697
Suburb Address Rooms Type Price Method SellerG Date Distance Postcode ... Bathroom Car Landsize BuildingArea YearBuilt CouncilArea Lattitude Longtitude Regionname Propertycount
0 Abbotsford 68 Studley St 2 h NaN SS Jellis 3/09/2016 2.5 3067.0 ... 1.0 1.0 126.0 NaN NaN Yarra City Council -37.8014 144.9958 Northern Metropolitan 4019.0
1 Abbotsford 85 Turner St 2 h 1480000.0 S Biggin 3/12/2016 2.5 3067.0 ... 1.0 1.0 202.0 NaN NaN Yarra City Council -37.7996 144.9984 Northern Metropolitan 4019.0
2 Abbotsford 25 Bloomburg St 2 h 1035000.0 S Biggin 4/02/2016 2.5 3067.0 ... 1.0 0.0 156.0 79.0 1900.0 Yarra City Council -37.8079 144.9934 Northern Metropolitan 4019.0
3 Abbotsford 18/659 Victoria St 3 u NaN VB Rounds 4/02/2016 2.5 3067.0 ... 2.0 1.0 0.0 NaN NaN Yarra City Council -37.8114 145.0116 Northern Metropolitan 4019.0
4 Abbotsford 5 Charles St 3 h 1465000.0 SP Biggin 4/03/2017 2.5 3067.0 ... 2.0 0.0 134.0 150.0 1900.0 Yarra City Council -37.8093 144.9944 Northern Metropolitan 4019.0

5 rows × 21 columns

Vemos que tenemos en total 21 variables algunas con aspecto de ser cualitativas y otras cuantitativas. En los proximos puntos iremos analizando las caracteristitcas de las mismas. Vemos en primer lugar el tipo de las variables:

dataframe.dtypes
len(dataframe["Suburb"].unique())
351
aux=pd.DataFrame({"Suburb":pd.value_counts(dataframe['Suburb']),"Method":pd.value_counts(dataframe['Method']),\
                  "Regionname":pd.value_counts(dataframe['Regionname']),"SellerG":pd.value_counts(dataframe['SellerG']),\
                 "Method":pd.value_counts(dataframe['Method']),"CouncilArea":pd.value_counts(dataframe['CouncilArea'])})
aux
Suburb Method Regionname SellerG CouncilArea
@Realty NaN NaN NaN 12.0 NaN
A NaN NaN NaN 1.0 NaN
AIME NaN NaN NaN 1.0 NaN
ASL NaN NaN NaN 5.0 NaN
Abbotsford 137.0 NaN NaN NaN NaN
... ... ... ... ... ...
iProperty NaN NaN NaN 1.0 NaN
iSell NaN NaN NaN 32.0 NaN
iTRAK NaN NaN NaN 33.0 NaN
viewbank 1.0 NaN NaN NaN NaN
voglwalpole NaN NaN NaN 2.0 NaN

785 rows × 5 columns

print(dataframe.describe())
aux=pd.DataFrame({"Suburb":dataframe["Suburb"].describe(),"CouncilArea":dataframe["CouncilArea"].describe(),\
                  "Regionname":dataframe["Regionname"].describe(),"SellerG":dataframe["SellerG"].describe(),\
                 "Method":dataframe["Method"].describe()})
aux
              Rooms         Price      Distance      Postcode      Bedroom2  \
count  34857.000000  2.724700e+04  34856.000000  34856.000000  26640.000000   
mean       3.031012  1.050173e+06     11.184929   3116.062859      3.084647   
std        0.969933  6.414671e+05      6.788892    109.023903      0.980690   
min        1.000000  8.500000e+04      0.000000   3000.000000      0.000000   
25%        2.000000  6.350000e+05      6.400000   3051.000000      2.000000   
50%        3.000000  8.700000e+05     10.300000   3103.000000      3.000000   
75%        4.000000  1.295000e+06     14.000000   3156.000000      4.000000   
max       16.000000  1.120000e+07     48.100000   3978.000000     30.000000   

           Bathroom           Car       Landsize  BuildingArea     YearBuilt  \
count  26631.000000  26129.000000   23047.000000   13742.00000  15551.000000   
mean       1.624798      1.728845     593.598993     160.25640   1965.289885   
std        0.724212      1.010771    3398.841946     401.26706     37.328178   
min        0.000000      0.000000       0.000000       0.00000   1196.000000   
25%        1.000000      1.000000     224.000000     102.00000   1940.000000   
50%        2.000000      2.000000     521.000000     136.00000   1970.000000   
75%        2.000000      2.000000     670.000000     188.00000   2000.000000   
max       12.000000     26.000000  433014.000000   44515.00000   2106.000000   

          Lattitude    Longtitude  Propertycount  
count  26881.000000  26881.000000   34854.000000  
mean     -37.810634    145.001851    7572.888306  
std        0.090279      0.120169    4428.090313  
min      -38.190430    144.423790      83.000000  
25%      -37.862950    144.933500    4385.000000  
50%      -37.807600    145.007800    6763.000000  
75%      -37.754100    145.071900   10412.000000  
max      -37.390200    145.526350   21650.000000  
Suburb CouncilArea Regionname SellerG Method
count 34857 34854 34854 34857 34857
unique 351 33 8 388 9
top Reservoir Boroondara City Council Southern Metropolitan Jellis S
freq 844 3675 11836 3359 19744

3.1 Análisis y transfromación de Variables Cualitativas

Para cada una de las variables cualitativas del dataframe comprobaremos sus medidas de centralidad y veremos cuales de ellas tiene sentido analizar.

dataframe.describe()
Rooms Price Distance Postcode Bedroom2 Bathroom Car Landsize BuildingArea YearBuilt Lattitude Longtitude Propertycount
count 34857.000000 2.724700e+04 34856.000000 34856.000000 26640.000000 26631.000000 26129.000000 23047.000000 13742.00000 15551.000000 26881.000000 26881.000000 34854.000000
mean 3.031012 1.050173e+06 11.184929 3116.062859 3.084647 1.624798 1.728845 593.598993 160.25640 1965.289885 -37.810634 145.001851 7572.888306
std 0.969933 6.414671e+05 6.788892 109.023903 0.980690 0.724212 1.010771 3398.841946 401.26706 37.328178 0.090279 0.120169 4428.090313
min 1.000000 8.500000e+04 0.000000 3000.000000 0.000000 0.000000 0.000000 0.000000 0.00000 1196.000000 -38.190430 144.423790 83.000000
25% 2.000000 6.350000e+05 6.400000 3051.000000 2.000000 1.000000 1.000000 224.000000 102.00000 1940.000000 -37.862950 144.933500 4385.000000
50% 3.000000 8.700000e+05 10.300000 3103.000000 3.000000 2.000000 2.000000 521.000000 136.00000 1970.000000 -37.807600 145.007800 6763.000000
75% 4.000000 1.295000e+06 14.000000 3156.000000 4.000000 2.000000 2.000000 670.000000 188.00000 2000.000000 -37.754100 145.071900 10412.000000
max 16.000000 1.120000e+07 48.100000 3978.000000 30.000000 12.000000 26.000000 433014.000000 44515.00000 2106.000000 -37.390200 145.526350 21650.000000

Antes de empezar el analisis de las variables indicar que el coeficiente de asimetria empleado es el de SKEWNESS por tanto para analizar los resultados podemos usar la sigueiente funcion.

  • Si el coeficiente de asimetría es menor que -1 o mayor que 1, la distribución de la variable es extremadamente sesgada.

  • Si el coeficiente de asimetría se encuentra entre -1 y -0,5 o entre 0,5 y 1, la distribución de la variable es moderadamente sesgada.

  • Si el coeficiente de asimetría se encuentra entre -0,5 y 0,5, la distribución de la variable es aproximadamente sesgada.

3.1.1 Analisis de la variable Rooms

Esta variable contiene el número de habitaciones de cada propiedad que hay en la muesta. Como se puede ver en la tabla 3.3.1 la variable tiene valor en 34857 toma valores discretos en el rango 1 a 16 dormitorios, que es el máximo encontrado. La mitad de la muestra tiene tres habitaciones o menos y el 75% de pisos tienen entre 1 y 4 habitaciones. A continuacion vamos a ver las frecuencias de la variable

pd.value_counts(dataframe['Rooms'])/dataframe["Rooms"].count()
3     0.432739
2     0.239034
4     0.228247
5     0.049832
1     0.042431
6     0.005852
7     0.000918
8     0.000545
10    0.000172
9     0.000115
12    0.000086
16    0.000029
Name: Rooms, dtype: float64

Como se puede ver mas de un 40% de los pisos vendidos tienen 3 dormitorios que es mas del doble del porcentaje del numero de pisos que tiene 2 dormitorios (un 23%) o 4 dormitorios(un 22,8%).

Pasamos a hacer el cálculo de las medidas de dispersión y simetria calcularemos el coficiente de variación, rango, IQR y simtetria:

mostrar_analisis_var_cuantitativas(dataframe["Rooms"])
coeficiente de Variacion rango de la variable rango intercuartilico coeficiente de asimetria Min Max Mean
0 32.000296 15 2.0 0.0 1 16 3.031012

Como se puede var en la tabla anterio la variable tiene un coeficiente de variacion del 32% con un coeficiente de asimetria igual a 0 por que la variable es simetrica.

mostrar_graf_variables_discretas(dataframe,"Rooms")
dataframe["Rooms_TR"]=dataframe["Rooms"].apply(np.sqrt)
sb.scatterplot(data=dataframe, x="Rooms", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()
sb.regplot(x="Rooms", y="Price", data=dataframe);
plot.show()
_images/3-TransformacionVariablesCuantitativas_17_0.png _images/3-TransformacionVariablesCuantitativas_17_1.png _images/3-TransformacionVariablesCuantitativas_17_2.png

Como ya se habia comprobado numéricamente la variable es muy simetrica aunque se aprecia unos outliers, viviendas de mas de 7 dormitorios que posteriormente veremos que efecto tienen en los modelos.
A priori no parece necesario tratar de ningún modo esta variable por ser simétrica y los outliers no parecen ser error de muestra.

3.1.2 Análisis de la variable Bedroom2

Esta variable contiene el número de dormitorios de cada propiedad. Como se puede ver en la tabla anterior la variable tiene valor en 26640 elementos de la muestra.Toma valores discretos en el rango 0 a 30 dormitorios, que es el máximo encontrado. La mitad de la muestra tiene tres dormitorios o menos y el 75% de pisos tienen entre 0 y 4 dormitorios. Estas cifras llaman la atencion ya que el máximo número de habitaciones de la variable rooms tenia como maximo 16, por lo que esos datos puede que estén mal imputados.

pd.value_counts(dataframe['Bedroom2'])/dataframe["Bedroom2"].count()
3.0     0.445983
4.0     0.238288
2.0     0.216854
5.0     0.053566
1.0     0.036261
6.0     0.006306
7.0     0.001126
0.0     0.000638
8.0     0.000488
9.0     0.000188
10.0    0.000150
30.0    0.000038
12.0    0.000038
20.0    0.000038
16.0    0.000038
Name: Bedroom2, dtype: float64

Los resultados son muy parecidos a los obtenidos con la variable Rooms por lo que no es probable que la variable rooms haga referencia también a número de dormitorios y no solo de habitaciones. Como ya ocurría con la variable rooms casi el 89% de las propiedades tiene entre 2 y 4 dormitorios. Vamos a verificar las medidas de dispersión y asimetría de la variable

mostrar_analisis_var_cuantitativas(dataframe["Bedroom2"])
coeficiente de Variacion rango de la variable rango intercuartilico coeficiente de asimetria Min Max Mean
0 31.792606 30.0 2.0 0.0 0.0 30.0 3.084647

El coeficiente de variacion es muy similar a la variable rooms y con el mismo rango intercuantilico, aunque en este caso el coficiente de asimetría es 0 lo que parece indica que se trata de una distribucion simétrica de los datos. Lo verificaremos con los siguientes diagramas:

mostrar_graf_variables_discretas(dataframe,"Bedroom2")
_images/3-TransformacionVariablesCuantitativas_24_0.png

Como ya se había comprobado numéricamente la variable es muy simétrica aunque se aprecia unos outliers, viviendas de más de 7 dormitorios que se deberían eliminar. También habrá que seleccionar que variable es de mejor calidad para llevar a cabo el modelo.

En este caso la variable tiene un coeficiente de asimetría 0 y algún outlier que veremos posteriormente como afecta al modelo

3.1.3 Analisis de la Variable Distance

La variable Distance indica la distancia al centro del inmbueble y toma como unidad las millas. Como se puede ver en la tabla 3.3.1 esta variable tiene valores en 34856 elementos de la muestra. La variable toma valores entre 0 y 48 millas , el 50% de los pisos de la muestra se encuentran a menos de 10,3 millas del centro de la ciudad y la desviacion tipica es 6,78. Calculamos medidas de dispersión y simetría ya que las de centralidad las hemos visto en la tabla inicial con la descripción del dataframe.

mostrar_analisis_var_cuantitativas(dataframe["Distance"])
coeficiente de Variacion rango de la variable rango intercuartilico coeficiente de asimetria Min Max Mean
0 60.696784 48.1 7.6 -0.026316 0.0 48.1 11.184929

Según el coeficiente la variable parece bastante simetrica, vemaos el boxplot para cerciorarnos. Vemos la distribucion de la variable y posibles outliers

mostrar_graf_variables_continuas(dataframe,"Distance")
_images/3-TransformacionVariablesCuantitativas_29_0.png _images/3-TransformacionVariablesCuantitativas_29_1.png

Como indica el coeficiente de asimetría, la variable es ligeramente asimétrica, vamos a intentar que se ajuste mejor a una distribución normal.

dataframe["BathsAndRooms"]=(dataframe["Rooms"]+dataframe["Bathroom"])/dataframe["Distance"].apply(np.sqrt)
dataframe_filtered=dataframe[dataframe["Distance"] >0]
dataframe_filtered.reset_index(drop=True,inplace=True)
sb.scatterplot(data=dataframe, x="Distance", y="Price")
plot.show()

dataframe["Distance_TRA"]=dataframe["Distance"].apply(np.sqrt)

mostrar_graf_variables_continuas(dataframe_filtered,"Distance")
sb.regplot(x="Distance_TRA", y="Price", data=dataframe);
plot.show()
sb.regplot(x="BathsAndRooms", y="Price", data=dataframe);
plot.show()

dataframe.corr()
_images/3-TransformacionVariablesCuantitativas_32_0.png _images/3-TransformacionVariablesCuantitativas_32_1.png _images/3-TransformacionVariablesCuantitativas_32_2.png _images/3-TransformacionVariablesCuantitativas_32_3.png
/home/inma/anaconda3/lib/python3.8/site-packages/numpy/core/function_base.py:153: RuntimeWarning: invalid value encountered in multiply
/home/inma/anaconda3/lib/python3.8/site-packages/numpy/linalg/linalg.py:1965: RuntimeWarning: invalid value encountered in greater
_images/3-TransformacionVariablesCuantitativas_32_5.png
Rooms Price Distance Postcode Bedroom2 Bathroom Car Landsize BuildingArea YearBuilt Lattitude Longtitude Propertycount Rooms_TR BathsAndRooms Distance_TRA
Rooms 1.000000 0.465238 0.271511 0.085890 0.946755 0.611826 0.393878 0.037402 0.156229 -0.012749 0.004872 0.103235 -0.071677 0.990772 0.492557 0.303786
Price 0.465238 1.000000 -0.211384 0.044950 0.430275 0.429878 0.201803 0.032748 0.100754 -0.333306 -0.215607 0.197874 -0.059017 0.460447 0.585621 -0.198883
Distance 0.271511 -0.211384 1.000000 0.481566 0.269524 0.126201 0.241835 0.060862 0.076301 0.323059 -0.100417 0.200946 -0.018140 0.286191 -0.498291 0.975137
Postcode 0.085890 0.044950 0.481566 1.000000 0.089292 0.120080 0.067886 0.040664 0.042437 0.089805 -0.231027 0.362895 0.017108 0.083589 -0.140948 0.409997
Bedroom2 0.946755 0.430275 0.269524 0.089292 1.000000 0.614892 0.388491 0.037019 0.154157 -0.002022 0.003447 0.106164 -0.053451 0.939649 0.465217 0.300193
Bathroom 0.611826 0.429878 0.126201 0.120080 0.614892 1.000000 0.307518 0.036333 0.147558 0.167955 -0.059183 0.106531 -0.032887 0.591324 0.573119 0.137240
Car 0.393878 0.201803 0.241835 0.067886 0.388491 0.307518 1.000000 0.037829 0.104373 0.128702 -0.009020 0.047213 -0.009617 0.396106 0.091560 0.270558
Landsize 0.037402 0.032748 0.060862 0.040664 0.037019 0.036333 0.037829 1.000000 0.354530 0.044474 0.025318 -0.002582 -0.018195 0.036586 0.015453 0.047017
BuildingArea 0.156229 0.100754 0.076301 0.042437 0.154157 0.147558 0.104373 0.354530 1.000000 0.067811 0.017155 -0.002143 -0.024523 0.152220 0.077408 0.069931
YearBuilt -0.012749 -0.333306 0.323059 0.089805 -0.002022 0.167955 0.128702 0.044474 0.067811 1.000000 0.091592 -0.022175 0.022420 -0.020429 -0.229233 0.340103
Lattitude 0.004872 -0.215607 -0.100417 -0.231027 0.003447 -0.059183 -0.009020 0.025318 0.017155 0.091592 1.000000 -0.345589 0.011112 0.010120 0.006591 -0.077277
Longtitude 0.103235 0.197874 0.200946 0.362895 0.106164 0.106531 0.047213 -0.002582 -0.002143 -0.022175 -0.345589 1.000000 0.016326 0.098764 -0.055585 0.203296
Propertycount -0.071677 -0.059017 -0.018140 0.017108 -0.053451 -0.032887 -0.009617 -0.018195 -0.024523 0.022420 0.011112 0.016326 1.000000 -0.076877 -0.017375 -0.044839
Rooms_TR 0.990772 0.460447 0.286191 0.083589 0.939649 0.591324 0.396106 0.036586 0.152220 -0.020429 0.010120 0.098764 -0.076877 1.000000 0.478817 0.320539
BathsAndRooms 0.492557 0.585621 -0.498291 -0.140948 0.465217 0.573119 0.091560 0.015453 0.077408 -0.229233 0.006591 -0.055585 -0.017375 0.478817 1.000000 -0.548055
Distance_TRA 0.303786 -0.198883 0.975137 0.409997 0.300193 0.137240 0.270558 0.047017 0.069931 0.340103 -0.077277 0.203296 -0.044839 0.320539 -0.548055 1.000000

4.3.4 Analisis de la variable Bathrooms

Esta variable indica el número de baños del inmuble.Como se puede ver en la tabla inicial la variable tiene valor en 26631 elementos de la muestra. Toma valores discretos en el rango 0 a 12 dormitorios. El 75% de pisos tienen entre 0 y 2 baños . A continuación, vamos a ver las frecuencias de la variable:

pd.value_counts(dataframe['Bathroom'])/dataframe["Bathroom"].count()
1.0     0.486989
2.0     0.415456
3.0     0.081897
4.0     0.010101
5.0     0.002891
0.0     0.001727
6.0     0.000601
7.0     0.000150
8.0     0.000113
9.0     0.000038
12.0    0.000038
Name: Bathroom, dtype: float64

Como se puede ver en la tabla anterior el 89% de la muestra tiene igual o menos de dos dormitorios con una media de 1,6 baños. En la tabla inicial respecto a las medidas de dispersión podemos ver que la desviación típica es de 0,72 y en la siguiente tabla vemos más variables de dispersión y asimetría:

mostrar_analisis_var_cuantitativas(dataframe["Bathroom"])
coeficiente de Variacion rango de la variable rango intercuartilico coeficiente de asimetria Min Max Mean
0 44.572429 12.0 1.0 -1.0 0.0 12.0 1.624798

El coeficiente de variación es del 44% y el coeficiente de asimetria es -1 lo que indica que la variable es moderadamente sesgada, tiene cola a la derecha. comprobaremos esto mismo de manera visual pintando su histograma y boxplot

mostrar_graf_variables_discretas(dataframe,"Bathroom")

sb.regplot(x="Bathroom", y="Price", data=dataframe);
plot.show()
_images/3-TransformacionVariablesCuantitativas_38_0.png _images/3-TransformacionVariablesCuantitativas_38_1.png
sb.scatterplot(data=dataframe, x="Bathroom", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()
_images/3-TransformacionVariablesCuantitativas_39_0.png
dataframe_filtered=dataframe[(dataframe["Bathroom"]>0) & (dataframe["Bathroom"] is not None)]
dataframe["Bathroom_TRA"]=dataframe["Bathroom"].apply(np.sqrt)
dataframe["Price_TRA"]=dataframe["Price"].apply(np.sqrt)
dataframe["Price_TRA"]=np.log2(dataframe["Price"])
#dataframe["Distance_SQR"]=dataframe["Distance"].apply(np.sqrt)
sb.scatterplot(data=dataframe, x="Bathroom_TRA", y="Price")
mostrar_graf_variables_continuas(dataframe,"Bathroom_TRA")
plot.show()

sb.displot(data=dataframe, x="Bathroom_TRA",y="Price_TRA",kind="kde")
plot.show()
#dataframe["Distance_SQR"]=dataframe["Distance"].apply(np.sqrt)
#sb.scatterplot(data=dataframe, x="Distance", y="Price")
#plot.show()
mostrar_graf_variables_continuas(dataframe,"Bathroom_TRA")
sb.regplot(x="Bathroom_TRA", y="Price_TRA", data=dataframe);
plot.show()
#hola
_images/3-TransformacionVariablesCuantitativas_40_0.png _images/3-TransformacionVariablesCuantitativas_40_1.png _images/3-TransformacionVariablesCuantitativas_40_2.png

3.1.5 Análisis de la variable Car

Esta variable contiene el número de plazas de aparcamiento que tiene asociadas la vivienda. Como se puede ver en la tabla inicial la variable tiene valor en 26129 de la muestra y toma valores discretos en el rango 0 a 26 plazas de aparcamiento. El 75% de pisos tienen entre 0 y 2 plazas de aparcamiento . A continuacion vamos a ver las frecuencias de la variable:

pd.value_counts(dataframe['Car'])/dataframe["Car"].count()
2.0     0.467450
1.0     0.350721
0.0     0.062421
3.0     0.061464
4.0     0.044433
5.0     0.005779
6.0     0.005358
7.0     0.000957
8.0     0.000880
10.0    0.000230
9.0     0.000115
11.0    0.000077
26.0    0.000038
12.0    0.000038
18.0    0.000038
Name: Car, dtype: float64

Como se puede ver casi el 47% de las casas de la muestra tienen dos plaza de aparcamiento y el 81% entre 1 y 2 plazas de aparcamiento.Respecto a las medidas de dispersión, en la tabla inicial podemos ver que la desviación típica es de 1.01. En la siguiente tabla vemos más variables de dispersión y asimetría:

mostrar_analisis_var_cuantitativas(dataframe["Car"])
coeficiente de Variacion rango de la variable rango intercuartilico coeficiente de asimetria Min Max Mean
0 58.465078 26.0 1.0 -1.0 0.0 26.0 1.728845

Como se puede ver hay un coeficiente de variación alto y asimetría por la izquierda que verificaremos mejor haciendo algunos diagramas

mostrar_graf_variables_discretas(dataframe,"Car")
_images/3-TransformacionVariablesCuantitativas_46_0.png
sb.scatterplot(data=dataframe, x="Car", y="Price")
mostrar_graf_variables_continuas(dataframe,"Car")
plot.show()
_images/3-TransformacionVariablesCuantitativas_47_0.png _images/3-TransformacionVariablesCuantitativas_47_1.png _images/3-TransformacionVariablesCuantitativas_47_2.png

3.1.6 Analisis de la variable Landsize

Esta variable contiene el tamaño del terreno asociado a la vivienda, excluye los metros de la vivienda y está calculada en metros cuadrados. La media de terreno asociado al inmbueble es de 593.598993 El 75% de pisos tienen menos de 670 metros cuadrados de parcela. A continuacion vamos a ver las frecuencias de la variable:

mostrar_analisis_var_cuantitativas(dataframe["Landsize"])
coeficiente de Variacion rango de la variable rango intercuartilico coeficiente de asimetria Min Max Mean
0 572.582161 433014.0 446.0 -0.331839 0.0 433014.0 593.598993

La variable es aproximadamente sesgada a la izquierda y con un rango de valores muy amplio.Pintamos algunos gráficos para entender mejor la asimietría y la dispersión del a variablable

mostrar_graf_variables_continuas(dataframe,"Landsize")
_images/3-TransformacionVariablesCuantitativas_51_0.png _images/3-TransformacionVariablesCuantitativas_51_1.png

Vamos a eliminar el registro superior que está desvirtuando el gráfico para poder analizarlo con mas detalle

#Eliminamos outliers superiores para poder seguir analizando 
df_filtered=dataframe[dataframe["Landsize"]<20000]
print("registros filtrado = ",(dataframe["Landsize"].count()-df_filtered["Landsize"].count()))
mostrar_graf_variables_continuas(df_filtered,"Landsize")



sb.scatterplot(data=df_filtered, x="Landsize", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()
registros filtrado =  23
_images/3-TransformacionVariablesCuantitativas_53_1.png _images/3-TransformacionVariablesCuantitativas_53_2.png _images/3-TransformacionVariablesCuantitativas_53_3.png

Continua habiendo outliers que hacen que la variabe sea muy dispersa por lo que la variable es clara condidata a ser transformada

#dataframe=dataframe[dataframe["Distance"].notna()] 

dataframe_filtered=dataframe[(dataframe["Landsize"]>0) ]

#dataframe_filtered.reset_index(drop=True,inplace=True)

#dataframe_filtered["Landsize_TRA"]=stats.boxcox(dataframe_filtered["Distance"])[0]

#dataframe_filtered["Landsize_TRA"]=dataframe_filtered["Landsize"].apply(np.sqrt)
dataframe_filtered["Landsize_TRA"]=np.log(dataframe_filtered["Landsize"])



sb.scatterplot(data=dataframe_filtered, x="Landsize_TRA", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()
#dataframe_filtered['Landsize_TRA'] = np.where(dataframe['Landsize'] >= 40000, 40000, (dataframe['Landsize']//100)*100)
#dataframe_filtered['Landsize_TRA'] = np.where(dataframe_filtered['Landsize_TRA'] <= 70, 70, dataframe_filtered['Landsize_TRA'])


sb.displot(data=dataframe_filtered, x="Landsize_TRA",y="Price")
plot.show()
#dataframe["Distance_SQR"]=dataframe["Distance"].apply(np.sqrt)
#sb.scatterplot(data=dataframe, x="Distance", y="Price")
#plot.show()
mostrar_graf_variables_continuas(dataframe_filtered,"Landsize_TRA")
_images/3-TransformacionVariablesCuantitativas_55_0.png _images/3-TransformacionVariablesCuantitativas_55_1.png _images/3-TransformacionVariablesCuantitativas_55_2.png _images/3-TransformacionVariablesCuantitativas_55_3.png

3.1.7 Análisis de la variable BulldingArea

Esta variable contiene el el tamaño del terreno asociado a la vivienda en metros cuadrados. Como se puede ver en la tabla inicial la variable tiene valor en 13742 elementos de la muestra.La media del tamaño de los inmubles de 160.25640 y toma valores continuos en el rango 0 a 44515 . El 75% de pisos tienen menos de 188.00000 metros cuadrado. A continuacion, vamos a ver las medidas de dispersión de la varibale:

mostrar_analisis_var_cuantitativas(dataframe["BuildingArea"])
coeficiente de Variacion rango de la variable rango intercuartilico coeficiente de asimetria Min Max Mean
0 250.390661 44515.0 86.0 0.209302 0.0 44515.0 160.2564

Como se puede ver la variable tiene asimetria a la derecha, pero en la tabla inicial vimos que la desviación estándar era muy alta para el valor que tomaba la media. Pasamos a comprobar visualmente la simetria.

mostrar_graf_variables_continuas(dataframe,"BuildingArea")
_images/3-TransformacionVariablesCuantitativas_59_0.png _images/3-TransformacionVariablesCuantitativas_59_1.png

Como se puede ver hay claramente algún outlier que desvirtua la muestra (ya lo pudimos ver tambien en la tabla inicial donde la media era de 522 y el máximo era mas de 44000 metros cuadrados de parcela). Eliminamos el el máximo en cuestión y repintamos los gráficos

#Eliminamos el maximo y vemos que ocurre
df_filtered=dataframe[dataframe["BuildingArea"]<1000]
print("registros filtrado = ",(dataframe["BuildingArea"].count()-df_filtered["BuildingArea"].count()))
mostrar_graf_variables_continuas(df_filtered,"BuildingArea")
#df_filtered["BuildingArea_TRA"]=np.log(dataframe_filtered["BuildingArea"])
df_filtered["BuildingArea_TRA"]=df_filtered["Distance"].apply(np.sqrt)
sb.scatterplot(data=df_filtered, x="BuildingArea_TRA", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()



df_filtered=dataframe[dataframe["YearBuilt"]>1800]

sb.scatterplot(data=df_filtered, x="YearBuilt", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()
registros filtrado =  13
_images/3-TransformacionVariablesCuantitativas_61_1.png _images/3-TransformacionVariablesCuantitativas_61_2.png _images/3-TransformacionVariablesCuantitativas_61_3.png _images/3-TransformacionVariablesCuantitativas_61_4.png

Los datos sin ese registro tienen mejor aspecto y parecen muy concentrados.

3.1.8 Análisis de la variable PropertyCountss

Esta variable contiene el numero de viviendas existentes en el barrio. Como se puede ver en la tabla inicial la variable tiene valor en 34854 y toma valores discretos en el rango 83 a 21650(que es el máximo de viviendas en un barrio). El 75% de pisos están en barrios con 10412 viviendas o menos. A continuación vamos a ver las frecuencias de la variable:

mostrar_analisis_var_cuantitativas(dataframe["Propertycount"])
coeficiente de Variacion rango de la variable rango intercuartilico coeficiente de asimetria Min Max Mean
0 58.472938 21567.0 6027.0 0.210884 83.0 21650.0 7572.888306

La variable es aproximadamente sesgada a la derecha , lo comprobaremos visalmente:

mostrar_graf_variables_continuas(dataframe,"Propertycount")
_images/3-TransformacionVariablesCuantitativas_66_0.png _images/3-TransformacionVariablesCuantitativas_66_1.png

3.1.9 Análisis de la variable Latitud

Esta variable contiene la coordenada geográfica correspondiente a la latitud y longitud del inmueble. Como se puede ver en las tablas de abajo.

mostrar_analisis_var_cuantitativas(dataframe["Lattitude"])
coeficiente de Variacion rango de la variable rango intercuartilico coeficiente de asimetria Min Max Mean
0 -0.238766 0.80023 0.10885 -0.016996 -38.19043 -37.3902 -37.810634
mostrar_analisis_var_cuantitativas(dataframe["Longtitude"])
coeficiente de Variacion rango de la variable rango intercuartilico coeficiente de asimetria Min Max Mean
0 0.082874 1.10256 0.1384 -0.073699 144.42379 145.52635 145.001851

Pintamos la distribución de los precios por localización tomando la latitud y longitud de las casas.

Se dividió por intervalos de precio y se asignó un color a cada uno de ellos.

-Color Azul -->['Price'] < float('500000.0')
-color Verde-->['Price'] >= float('500000.0')) & (v['Price'] < float('800000.0'))
-Color Amarillo-->['Price'] >= float('800000.0')) & (v['Price'] < float('1200000.0'))
-Color cian-->['Price'] >= float('1200000.0'))& (v['Price'] < float('1500000.0'))
-Color Rojo-->['Price'] >= float('1500000.0'))& (v['Price'] < float('1800000.0'))
-Color Naranja-->['Price'] >= float('1800000.0'))& (v['Price'] < float('2100000.0'))
-Color Morado-->['Price'] >= float('2100000.0'))
mapa  
Make this Notebook Trusted to load map: File -> Trust Notebook

Utilizamos la información obtenida para localizar el suburbio más caro, el cual asumimos que es el centro de la ciudad que corresponde con el suburbio “Koyong”.

Finalmente localizamos el centro del suburbio y calculamos las nuevas distancias entre la localización de las viviendas y en centro.

Llamaremos a la nueva variable “Distancia_NEW”.

data_filtered.describe()
Rooms Price Distance Postcode Bedroom2 Bathroom Car Landsize BuildingArea YearBuilt Lattitude Longtitude Propertycount Distancia_NEW
count 20745.000000 2.074500e+04 20745.000000 20745.000000 20745.000000 20745.000000 20368.000000 17923.000000 10630.000000 12060.000000 20745.000000 20745.00000 20745.000000 20745.000000
mean 3.060448 1.090769e+06 11.324256 3113.999711 3.045312 1.590648 1.714061 573.133237 152.615705 1966.571725 -37.807239 144.99744 7512.042805 13.247745
std 0.944267 6.530960e+05 6.760154 114.505996 0.954757 0.700730 0.992946 3541.036660 130.914026 36.762902 0.090992 0.11968 4402.018524 7.996934
min 1.000000 8.500000e+04 0.000000 3000.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1196.000000 -38.190430 144.54022 83.000000 0.154197
25% 2.000000 6.600000e+05 6.400000 3046.000000 2.000000 1.000000 1.000000 218.000000 100.000000 1950.000000 -37.860710 144.92538 4380.000000 7.411733
50% 3.000000 9.100000e+05 10.400000 3087.000000 3.000000 1.000000 2.000000 512.000000 133.000000 1970.000000 -37.800200 145.00362 6567.000000 12.028238
75% 4.000000 1.336000e+06 14.200000 3152.000000 4.000000 2.000000 2.000000 663.000000 181.000000 2000.000000 -37.749030 145.06906 10331.000000 17.184520
max 16.000000 1.120000e+07 47.300000 3978.000000 20.000000 9.000000 18.000000 433014.000000 6791.000000 2019.000000 -37.397800 145.52635 21650.000000 49.606282

3.2 Correlación de Variables

Calculamos la correlación entre las variables entre ellas, prestando especial atención a la relación con el precio, para poder seleccionar las variables más adecuadas para incluir en el modelo.

data_filtered.describe()
data_filtered.corr()
Rooms Price Distance Postcode Bedroom2 Bathroom Car Landsize BuildingArea YearBuilt Lattitude Longtitude Propertycount Distancia_NEW
Rooms 1.000000 0.445512 0.280907 0.081848 0.958588 0.607710 0.394790 0.030376 0.412407 -0.002366 0.016175 0.092219 -0.058979 0.210926
Price 0.445512 1.000000 -0.237291 0.037431 0.430950 0.430758 0.202400 0.035348 0.333616 -0.333288 -0.215666 0.197204 -0.052693 -0.411055
Distance 0.280907 -0.237291 1.000000 0.493173 0.283718 0.138696 0.243403 0.028702 0.099025 0.316759 -0.120985 0.225098 0.011115 0.770305
Postcode 0.081848 0.037431 0.493173 1.000000 0.085376 0.122073 0.059939 0.022980 0.057798 0.096296 -0.236190 0.387403 0.038049 0.169491
Bedroom2 0.958588 0.430950 0.283718 0.085376 1.000000 0.605030 0.396416 0.030259 0.406564 0.007169 0.016095 0.094752 -0.059033 0.213105
Bathroom 0.607710 0.430758 0.138696 0.122073 0.605030 1.000000 0.305113 0.035218 0.383816 0.184631 -0.051202 0.107921 -0.039363 0.049227
Car 0.394790 0.202400 0.243403 0.059939 0.396416 0.305113 1.000000 0.028704 0.214519 0.124509 -0.002078 0.043590 -0.012386 0.185714
Landsize 0.030376 0.035348 0.028702 0.022980 0.030259 0.035218 0.028704 1.000000 0.069745 0.042427 0.004271 0.018423 -0.009629 0.022033
BuildingArea 0.412407 0.333616 0.099025 0.057798 0.406564 0.383816 0.214519 0.069745 1.000000 0.072366 -0.032668 0.069912 -0.042123 0.035146
YearBuilt -0.002366 -0.333288 0.316759 0.096296 0.007169 0.184631 0.124509 0.042427 0.072366 1.000000 0.094413 -0.020125 0.024310 0.313152
Lattitude 0.016175 -0.215666 -0.120985 -0.236190 0.016095 -0.051202 -0.002078 0.004271 -0.032668 0.094413 1.000000 -0.336594 0.028153 0.237945
Longtitude 0.092219 0.197204 0.225098 0.387403 0.094752 0.107921 0.043590 0.018423 0.069912 -0.020125 -0.336594 1.000000 0.022653 -0.322622
Propertycount -0.058979 -0.052693 0.011115 0.038049 -0.059033 -0.039363 -0.012386 -0.009629 -0.042123 0.024310 0.028153 0.022653 1.000000 0.020920
Distancia_NEW 0.210926 -0.411055 0.770305 0.169491 0.213105 0.049227 0.185714 0.022033 0.035146 0.313152 0.237945 -0.322622 0.020920 1.000000
sb.heatmap(data_filtered.corr(), annot=True, fmt='.2f')
<matplotlib.axes._subplots.AxesSubplot at 0x7faea4c37e80>
_images/3-TransformacionVariablesCuantitativas_76_1.png

En primer lugar, se puede observar que la nueva variable “Distancia_NEW” tiene una correlación bastante más alta -0.411055 que la variable “Distance” -0.238312, con el precio.

Además de las variable “Distancia_NEW” hay otras dos variables que presentan un coeficiente de correlación alto “Bathrooms” 0.387676 y “rooms” 0.416335 que es la más alta. Es importante tener en cuenta que ambas variables presentan también alta correlación entre ellas y esto podría crear problemas en las prediciones.

data_filtered.to_csv("Variables_Cuantitativas_v2.csv")